package com.linsen.core.satoken.strategy;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.HashMap;
import java.util.Map;

/**
 * 功能点	Simple 简单模式	Mixin 混入模式	Stateless 无状态模式
 * Token风格	jwt风格	jwt风格	jwt风格
 * 登录数据存储	Redis中存储	Token中存储	Token中存储
 * Session存储	Redis中存储	Redis中存储	无Session
 * 注销下线	前后端双清数据	前后端双清数据	前端清除数据
 * 踢人下线API	支持	不支持	不支持
 * 顶人下线API	支持	不支持	不支持
 * 登录认证	支持	支持	支持
 * 角色认证	支持	支持	支持
 * 权限认证	支持	支持	支持
 * timeout 有效期	支持	支持	支持
 * activity-timeout 有效期	支持	支持	不支持
 * id反查Token	支持	支持	不支持
 * 会话管理	支持	部分支持	不支持
 * 注解鉴权	支持	支持	支持
 * 路由拦截鉴权	支持	支持	支持
 * 账号封禁	支持	支持	不支持
 * 身份切换	支持	支持	支持
 * 二级认证	支持	支持	支持
 * 模式总结	Token风格替换	jwt 与 Redis 逻辑混合	完全舍弃Redis，只用jwt
 *
 * @author zhaoyong
 * @date 2023/3/31
 */
@Getter
@AllArgsConstructor
public enum JwtStrategy {

    SIMPLE("simple", "Simple 简单模式"),
    MIXIN("mixin", "Mixin 混入模式"),
    STATELESS("stateless", "Stateless 无状态模式"),
    ;

    @JsonValue
    private String value;
    private String description;

    private static final Map<String, JwtStrategy> VALUES = new HashMap<>();

    static {
        for (final JwtStrategy jwtStrategy : JwtStrategy.values()) {
            JwtStrategy.VALUES.put(jwtStrategy.getValue(), jwtStrategy);
        }
    }

    @JsonCreator
    public static JwtStrategy getByValue(String value) {
        return JwtStrategy.VALUES.get(value);
    }
}
